﻿using System;
using System.Data;
using System.Configuration;
using System.Data.OleDb;

using System.Text;
using System.Net.Json;

namespace JSClass
{
	/// <summary>
    /// TableQuery의 요약 설명입니다.
	/// </summary>
	public class TableQuery : TableModel
    {
        /** 
	     * 오라클 연결 이름
	     */
        private String connStr = "ex_db";
        /** 
	     * 오라클 연결 객체
	     */
        private OleDbConnection conn = null;

        /** 
         * 검색을 수행할 쿼리
         */
        private String ExecuteQuery = "";

        /** 
         * 검색 전체 건수를 알아내는 쿼리
         */
        private String CountQuery = "";

        private JsonObjectCollection sel = new JsonObjectCollection();
        
        /* *
	     * 쿼리문을 받아서 쿼리를 실행하고 검색 결과를 저장하는 함수
	     * @param query SQL 문장
	     */
        public TableQuery(String query)
	    {
            CountQuery = "SELECT COUNT(*) CNT ";
		    CountQuery += " from (" +  query + " ) ";
    		
            ExecuteQuery = query;
            
            QueryProcess();
        }

        /* *
         * 쿼리문을 받아서 쿼리를 실행하고 검색 결과를 저장하는 함수
         * @param query SQL 문장
	     * @param start 패치해 올 구간의 시작 번호
	     * @param end 패치해 올 구간의 끝 번호
         */
        public TableQuery(String query, int start, int end)
        {
            CountQuery = "SELECT COUNT(*) CNT  ";
            CountQuery += " from (" + query + " ) ";

            ExecuteQuery = "SELECT * ";
            ExecuteQuery += "FROM ";
            ExecuteQuery += "	( ";
            ExecuteQuery += "	SELECT ROWNUM AS NUMB , A.* ";
            ExecuteQuery += "	FROM  ";
            ExecuteQuery += "		( ";
            ExecuteQuery += query;
            ExecuteQuery += "		) A WHERE ROWNUM <= " + end + " ";
            ExecuteQuery += "	) ";
            ExecuteQuery += "WHERE NUMB >= " + start + " ";

            QueryProcess();
        }

        /* *
         * 쿼리문을 받아서 쿼리를 실행하고 검색 결과를 저장하는 함수
         * @param query SQL 문장
	     * @param start 패치해 올 구간의 시작 번호
	     * @param end 패치해 올 구간의 끝 번호
	     * @param str 오라클 연결 설정 이름
         */
        public TableQuery(String query, int start, int end , String str)
        {
            connStr = str;
            
            CountQuery = "SELECT COUNT(*) CNT  ";
            CountQuery += " from (" + query + " ) ";

            ExecuteQuery = "SELECT * ";
            ExecuteQuery += "FROM ";
            ExecuteQuery += "	( ";
            ExecuteQuery += "	SELECT ROWNUM AS NUMB , A.* ";
            ExecuteQuery += "	FROM  ";
            ExecuteQuery += "		( ";
            ExecuteQuery += query;
            ExecuteQuery += "		) A WHERE ROWNUM <= " + end + " ";
            ExecuteQuery += "	) ";
            ExecuteQuery += "WHERE NUMB >= " + start + " ";

            QueryProcess();
        }

        /**
         * 쿼리문을 받아서 쿼리를 실행하고 검색 결과를 저장하는 함수
         */
        private void QueryProcess()
	    {
		    sel = new JsonObjectCollection();
    		
		    try {
			    this.openDB();
    			
			    this.SetTotalCount();
    			
			    DataSet ds = new DataSet();
                OleDbDataAdapter oraCmd = new OleDbDataAdapter(ExecuteQuery, conn);
				oraCmd.Fill(ds, "table");
				
				int rowCount = ds.Tables["table"].Rows.Count;
				int colCount = ds.Tables["table"].Columns.Count;
				
				DataColumn[] columnss = new DataColumn[colCount];
				base.initColumn(colCount);
				
				if (colCount > 0)
				{
					int col = 0;
					foreach (DataColumn JSdc in ds.Tables["table"].Columns)
					{
						String columnName = JSdc.ColumnName;
						base.setColumnName(columnName, col);
                        col++;
					}
				}
				
				if (rowCount > 0)
				{
					foreach (DataRow JSdr in ds.Tables["table"].Rows)
					{
						base.insert();
						for (int col = 0; col < colCount; col++)
						{
							base.setValueAt(JSdr[col], col);
						}
					}
				}
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
            finally
            {
                closeDB();
            }
	    }

        /**
         * 검색하는 sql의 전체 검색건수를 쿼리하는 함수
         */
        private void SetTotalCount()
	    {
		    try {
			    OleDbCommand cmdSelectSido = new OleDbCommand(CountQuery, conn);
                OleDbDataReader rdrSelectSido = cmdSelectSido.ExecuteReader();

                if (rdrSelectSido.Read())
                {
                    sel.Add(new JsonStringValue("totalcount", rdrSelectSido["CNT"].ToString()));
                }
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
	    }


        /**
         * JSON 객체에 검색 결과를 기록하는 함수
         */
        public String GetJSON()
        {
            JsonArrayCollection items = new JsonArrayCollection("root");
            sel.Add(items); 
            
            for (int row = 0; row < this.getRowCount(); row++)
            {
                JsonObjectCollection moreinfo = new JsonObjectCollection();
                for (int col = 0; col < getColumnCount(); col++)
                {
                    String colName = this.getColumnName(col);
                    String colValue = this.getValueAt(row, col).ToString();
                    moreinfo.Add(new JsonStringValue(colName, colValue));
                }
                items.Add(moreinfo);
            }
            return sel.ToString();
        }
        
        /**
		* 오라클 연결을 생성한다.
		* @return 오라클 연결 객체
		*/
		private void openDB()
		{
            //conn = new OleDbConnection(ConfigurationSettings.AppSettings[connStr]);
            conn = new OleDbConnection("Provider=OraOLEDB.Oracle.1;Password=exgis2011;Persist Security Info=True;User ID=exgis2011;Data Source=oragis");
            conn.Open();
		}
		
		/**
		* 오라클 연결을 닫는다.
		* @return 오라클 연결 객체
		*/
		private void closeDB()
		{
            conn.Close();
		}
	}
}
